/* PR c/102989 */
/* { dg-do run { target { bitint && int32plus } } } */
/* { dg-options "-std=c23 -pedantic-errors" } */
/* { dg-skip-if "" { ! run_expensive_tests }  { "*" } { "-O0" "-O2" } } */
/* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */

#if __BITINT_MAXWIDTH__ >= 135
__attribute__((noipa)) void
test_135 (unsigned _BitInt(135) *p, unsigned _BitInt(39) *q, int i)
{
  p[3] = p[0] / p[1];
  p[4] = p[2] / *q;
  p[5] = p[i] % p[1 + i];
  p[6] = p[2 + i] % q[i];
}
#endif

#if __BITINT_MAXWIDTH__ >= 192
__attribute__((noipa)) void
test_192 (unsigned _BitInt(192) *p, unsigned _BitInt(62) *q, int i)
{
  p[3] = p[0] / p[1];
  p[4] = p[2] / *q;
  p[5] = p[i] % p[1 + i];
  p[6] = p[2 + i] % q[i];
}
#endif

#if __BITINT_MAXWIDTH__ >= 575
__attribute__((noipa)) void
test_575 (unsigned _BitInt(575) *p, unsigned _BitInt(125) *q, int i)
{
  p[3] = p[0] / p[1];
  p[4] = p[2] / *q;
  p[5] = p[i] % p[1 + i];
  p[6] = p[2 + i] % q[i];
}
#endif

int
main ()
{
#if __BITINT_MAXWIDTH__ >= 135
  static unsigned _BitInt(135) s135[] = {
    39967592296255191197035336461290090324829uwb,
    312558523056789678960549094065358uwb,
    32832062726968675550596542626872563693099uwb,
    0, 0, 0, 0,
    39684305085076546670125468925068uwb,
    6804617795530664696186192571276807994017uwb,
    908900452537968951389639987294090uwb,
    0, 0, 0, 0,
    20395215776806618633686937572550377003558uwb,
    1uwb,
    2017874535031304931048003948865783841241uwb,
    0, 0, 0, 0,
    16804502949303659647220377886348649uwb,
    15969624846496231063802991739581uwb,
    12583271616670577644431817717623569600333uwb,
    0, 0, 0, 0,
    127872348uwb,
    89851078235647451008683745245uwb,
    65571357606183724433879897404245uwb,
    87071527329uwb,
    0uwb,
    2093478262068616207802533uwb,
    39684305085076546670125468925068uwb,
    228138242uwb,
    20395215776806618633686937572550377003558uwb,
    12999486295301452164134194354389uwb,
    0uwb,
    65232213uwb,
    1052uwb,
    299601705158823277248376612324370704769uwb,
    4457610789624568099630576309437uwb,
    35uwb
  };
  static unsigned _BitInt(39) s39[] = {
    365405328146uwb,
    434158056uwb,
    155227252uwb,
    42uwb
  };
  for (int i = 0; i < 4; ++i)
    {
      test_135 (s135 + 7 * i, s39 + i, 0);
      for (int j = 0; j < 4; ++j)
	if (s135[7 * i + 3 + j] != s135[7 * 4 + 4 * i + j])
	  __builtin_abort ();
    }
#endif
#if __BITINT_MAXWIDTH__ >= 192
  static unsigned _BitInt(192) s192[] = {
    1124505164324393257294640774883626666393496137407657383285uwb,
    267770052679215918410877624132556357420375522461819642uwb,
    4639722531344459905931256257525470190970246632351027146771uwb,
    0, 0, 0, 0,
    37076404019741709360338653279977uwb,
    4017103983634913740425503780735862298200532685100197316953uwb,
    3278541912894246916134094695331450716143029898422059693966uwb,
    0, 0, 0, 0,
    181260360652955273548771772757571198044332327135683350561uwb,
    3uwb,
    278424729322219534657080470631020618602047522343uwb,
    0, 0, 0, 0,
    1546922522984382736106987324181069322701408057466881095437uwb,
    2859498891267655913293729558067200232488079281528uwb,
    3754903553201168811081807274774774084224112858563658575772uwb,
    0, 0, 0, 0,
    4199uwb,
    1361868478710180046608174894774272890845uwb,
    138713124365615887365631151022521585339318590476706527uwb,
    704022636372799201uwb,
    0uwb,
    1800071738275562493471915107371110587374384505uwb,
    37076404019741709360338653279977uwb,
    989224815596uwb,
    60420120217651757849590590919190399348110775711894450187uwb,
    35811149155369659378220712438655uwb,
    0uwb,
    971271817233568uwb,
    540976787uwb,
    268207396657226343648700519626769577444579489897404183983uwb,
    356343883111794920610945410844353911944595204901uwb,
    10uwb
  };
  static unsigned _BitInt(62) s62[] = {
    3406880035683564506uwb,
    1821339585074uwb,
    7774805776666105uwb,
    14uwb
  };
  for (int i = 0; i < 4; ++i)
    {
      test_192 (s192 + 7 * i, s62 + i, 0);
      for (int j = 0; j < 4; ++j)
	if (s192[7 * i + 3 + j] != s192[7 * 4 + 4 * i + j])
	  __builtin_abort ();
    }
#endif
#if __BITINT_MAXWIDTH__ >= 575
  static unsigned _BitInt(575) s575[] = {
    68262105478469356136430990337792292171975154797241096882998520215082649730969604949380226799284423285674920339289406073226899446201591827481846481242318203838114185414101609uwb,
    522191246473430521641066810210970739255168853016819760532584735359478867620239849176927824047731938802486584777452655079470889576128018146184619338332252916338uwb,
    3435470059299599312416077239534464560179043115309368866437635382063534713476732558299272800804091725646363342046360614869573337710790812486381755554721429381220646362uwb,
    0, 0, 0, 0,
    1395593888697848626057320338038084790564831152710988743807319327067660279846004696629681887779842129545558985841571482256386uwb,
    21441995702257150447349407715894435455050772126685461031315827571889336447926694701361700730379084806621691641000793333457504299685338550064151630805530260276144722300318378uwb,
    1810496946211232933828329287232831944898449501818263455079805575961543103376888822223202088001971904867510317357383306521333499198279246848350610021364570531uwb,
    0, 0, 0, 0,
    49645180073615279861687094823459626955281549193691328477580826482861925123118554141451230055925103484376691314925103229496483975307219087542024089047037648064847114147876643uwb,
    5uwb,
    107934287940096962208124285810972463665238866518161589834947495273979231095066254158254278656128778606292981405785821524489035396101282777095285918056890626313652996363360635uwb,
    0, 0, 0, 0,
    23608107814490548232484082204335368855445148092939475311496653239338164906367806895605948777993633707136572413097677855946274968766053297446456942019070196462866449343995194uwb,
    2583203116898176965174690967993977971553570592649244007260134674599130988578292547989776393639164uwb,
    275574884364090029934989506452294812428150053792728044335881034126425125444715551780251783116966457185581504439797097624639857491748084495990405201247685674533629814uwb,
    0, 0, 0, 0,
    130722423900191uwb,
    98209305532955450849963417931387543706587302562952677389372338515039360888927455577958981902466648551427758908831114835123178381uwb,
    452871192905895539483003814306315901853065835276102489810630370966701886335873219401733574293829636677996055324174200714778800368052970790656772945453428881051uwb,
    22873946842052620485494389199978222125uwb,
    0uwb,
    47552124733256427939572722329767524480111793387357122806941820665877774450470824535764237662603507442099431904312121406656289uwb,
    1395593888697848626057320338038084790564831152710988743807319327067660279846004696629681887779842129545558985841571482256386uwb,
    12402931424678892069400953011343uwb,
    9929036014723055972337418964691925391056309838738265695516165296572385024623710828290246011185020696875338262985020645899296795061443817508404817809407529612969422829575328uwb,
    765676291859168654790768770138076157159515580930329832291016877204190990758886004368955392441159337179098419446671535422387547862111454482076132380462913464uwb,
    3uwb,
    139483670059084867uwb,
    9139083047731208433628027573752517850138452745189939065766817977544782897707uwb,
    582502183871265798930967135317783829723227597448966288820692884195884049998974821351103238544771373433464199926206342695349404216240804690670860uwb,
    331751853749540937734694164624358910388009028150635800666238028944699092436048473910402462998246uwb,
    30656037717616877434uwb
  };
  static unsigned _BitInt(125) s125[] = {
    34981105310298535974120492274604066977uwb,
    38073944253116192522082228985492uwb,
    140965952697865937uwb,
    473088156567311094933uwb
  };
  for (int i = 0; i < 4; ++i)
    {
      test_575 (s575 + 7 * i, s125 + i, 0);
      for (int j = 0; j < 4; ++j)
	if (s575[7 * i + 3 + j] != s575[7 * 4 + 4 * i + j])
	  __builtin_abort ();
    }
#endif
}
